{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 获取浮点数的尾数和指数\n",
    "\n",
    "参考：[frexp](https://learn.microsoft.com/zh-cn/cpp/c-runtime-library/reference/frexp)\n",
    "\n",
    "```c++\n",
    "float frexp(\n",
    "   float x,\n",
    "   int * expptr\n",
    ");  // C++ only\n",
    "long double frexp(\n",
    "   long double x,\n",
    "   int * expptr\n",
    ");  // C++ only\n",
    "```\n",
    "\n",
    "参数：\n",
    "\n",
    "- `x`：浮点值。\n",
    "- `expptr`：指向存储的整数指数的指针。\n",
    "\n",
    "{func}`frexp` 返回尾数。 如果 `x` 为 `0`，则该函数将返回 `0` 表示尾数和指数。如果 `expptr` 是 `NULL`，则调用无效的参数处理程序，如参数验证中所述。 如果允许执行继续，则该函数将 `errno` 设置为 `EINVAL` 并返回 `0`。\n",
    "\n",
    "```{note}\n",
    "`frexp` 函数将浮点值（`x`）分解为尾数（mantissa `m`）和指数（exponent，`n`），使绝对值 `m` 大于或等于 `0.5` 且小于 `1.0`，并且 $x = m * 2^n$。整数指数 `n` 存储在由 `expptr` 指向的位置。\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "#include <iostream>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "std::frexp(x, &n) => 16.4 = 0.5125 * (1 << 5)"
     ]
    }
   ],
   "source": [
    "double x, y;\n",
    "int n;\n",
    "x = 16.4;\n",
    "y = frexp(x, &n);\n",
    "std::cout << \"std::frexp(x, &n) => \" \n",
    "         << x << \" = \" << y << \" * \"\n",
    "         << \"(1 << \" << n << \")\";"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "vscode": {
     "languageId": "c++"
    }
   },
   "source": [
    "将双精度有效数字转换为整数有效数字，即将小数点放在第 31 位和第 30 位之间。这是通过将双精度值乘以 $2^{31}$，然后将其转换为 int 来实现的。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "C++14",
   "language": "C++14",
   "name": "xcpp14"
  },
  "language_info": {
   "codemirror_mode": "text/x-c++src",
   "file_extension": ".cpp",
   "mimetype": "text/x-c++src",
   "name": "c++",
   "version": "14"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
